﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Reflection;
using System.IO;
using System.Diagnostics;

namespace template_dll
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }
        private DateTime dateDef;                           // дата дефектуры по аптекам
        private DateTime dateDP1;                           // начало периода дефектуры по товарам, фильтр по поставщикам
        private DateTime dateDP2;                           // окончание периода дефектуры по товарам, фильтр по поставщикам
        private DateTime dateDPP1;                          // начало периода дефектуры по товарам, фильтр по аптекам
        private DateTime dateDPP2;                          // окончание периода дефектуры по товарам, фильтр по аптекам
        private DataTable pharm = new DataTable();          // таблица списка аптек
        private DataTable suppl = new DataTable();          // таблица списка поставщиков
        private DataTable pharm_city = new DataTable();     // таблица списка аптек по городам
        private DataTable dt_pharm;                         // таблица кодов аптек для фильтра
        private DataTable dt_suppl;                         // таблица кодов поставщика
        private const string namechcol = "Флаг";
        private SqlConnection conn;
        private DataTable dt_rep = new DataTable();             // возвращает значение дефектуры по аптекам
        private DataTable dt_rep_dr = new DataTable();            // возвращает значение дефектуры по товрам, фильтр по поставщикам
        private DataTable dt_rep_dr_ph = new DataTable();       // возвращает значение дефектуры по товарам, фильтр по аптекам
        private delegate void Deleg();
        private Deleg del;

        public static bool DisplayForm(System.Windows.Forms.Form theMDIParent)
        {
            ChildForm f = new ChildForm();
            f.MdiParent = theMDIParent;
            f.WindowState = FormWindowState.Maximized;
            f.Show();
            return true;
        }

        private string GetServ(string filename)
        {
            string str = "";
            using (StreamReader streamReader = new StreamReader(filename))
            {
                while (!streamReader.EndOfStream)
                {
                    str += streamReader.ReadLine();
                }
            }
            return str;
        }

        private void ChildForm_Load(object sender, EventArgs e)
        {
            
            this.Text = "Дефектура поставщиков";
            conn = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=PharmOLAPDW;Integrated Security=True");
            pharm = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn, "pas_PharmSel", 30, null);
            SqlConnection conn1 = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=AllPriceDW;Integrated Security=True");
            suppl = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn1, "pas_SupplSel", 30, null);
            pharm_city = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn1, "pas_PharmSel", 30, null);
            foreach (DataColumn dc in suppl.Columns)
            {
                if (dc.ColumnName != "Флаг") dc.ReadOnly = true;
                else dc.ReadOnly = false;
            }
            foreach (DataColumn dc in pharm.Columns)
            {
                if (dc.ColumnName != "Флаг") dc.ReadOnly = true;
                else dc.ReadOnly = false;
            }
            foreach (DataColumn dc in pharm_city.Columns)
            {
                if (dc.ColumnName != "Флаг") dc.ReadOnly = true;
                else dc.ReadOnly = false;
            }
            this.dateTimePicker1.Value = DateTime.Now.AddDays(-1).Date;
            this.dateTimePicker2.Value = DateTime.Now.AddDays(-1).Date;
            this.dateTimePicker3.Value = DateTime.Now.AddDays(-1).Date;
            this.dateTimePicker4.Value = DateTime.Now.AddDays(-1).Date;
            this.dateTimePicker5.Value = DateTime.Now.AddDays(-1).Date;
            dateDef = this.dateTimePicker1.Value;
            dateDP1 = this.dateTimePicker2.Value;
            dateDP2 = this.dateTimePicker3.Value;
            dateDPP1 = this.dateTimePicker4.Value;
            dateDPP2 = this.dateTimePicker5.Value;
        }

        private void StartCreateRep(object sender, EventArgs e)
        {
            //- формируется отчёт по аптекам общий свод
            if (sender == this.button2)
            {
                dataGridView1.DataSource = null;
                dt_pharm = new DataTable();
                dt_pharm.Columns.Add();
                dt_rep.Clear();
                del = new Deleg(CreateRep);
                this.Text += " Формируется";
                IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc), null); //
                panel1.Enabled = false;
                tabPage2.Enabled = false;
                tabPage3.Enabled = false;
                dataGridView1.Enabled = false;
            }
            //- формируется отчёт по товарам 
            else if (sender == this.button4)
            {
                dataGridView2.DataSource = null;
                dt_suppl = new DataTable();
                dt_suppl.Columns.Add();
                dt_suppl.Columns.Add();
                dt_suppl.Columns.Add();
                del = new Deleg(CreateRepDrug);
                this.Text += " Формируется";
                IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc1), null); //
                panel2.Enabled = false;
                tabPage1.Enabled = false;
                tabPage3.Enabled = false;
                dataGridView2.Enabled = false;
            }
            else if (sender == this.button9)
            {
                dataGridView3.DataSource = null;
                dt_pharm = new DataTable();
                dt_pharm.Columns.Add();
                dt_pharm.Columns.Add();
                dt_pharm.Columns.Add();
                dt_rep_dr_ph.Clear();
                del = new Deleg(CreateRepDrugPharm);
                this.Text += " Формируется";
                IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc2), null); //
                panel3.Enabled = false;
                tabPage1.Enabled = false;
                tabPage2.Enabled = false;
                dataGridView3.Enabled = false;
            }
        }
//- для формирования отчёта по аптекам
        private void CallBackFunc(IAsyncResult aRes)
        {
            del.EndInvoke(aRes);
            panel1.Invoke((Func<bool>)(() => panel1.Enabled = true));
            tabPage2.Invoke((Func<bool>)(() => tabPage2.Enabled = true));
            tabPage3.Invoke((Func<bool>)(() => tabPage3.Enabled = true));
            dataGridView1.Invoke((Func<bool>)(() => dataGridView1.Enabled = true));
            this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            if (dt_rep.Rows.Count > 0)
            {
                dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep.DefaultView));
                dataGridView1.Invoke((Func<object>)(() => dataGridView1.Columns[4].DefaultCellStyle.Format = "p"));
            }
        }
//- для формирования отчёта по товарам, фильтр по поставщикам
        private void CallBackFunc1(IAsyncResult aRes)
        {
            del.EndInvoke(aRes);
            panel2.Invoke((Func<bool>)(() => panel2.Enabled = true));
            tabPage1.Invoke((Func<bool>)(() => tabPage1.Enabled = true));
            tabPage3.Invoke((Func<bool>)(() => tabPage3.Enabled = true));
            dataGridView2.Invoke((Func<bool>)(() => dataGridView2.Enabled = true));
            this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            try
            {
                if (dt_rep_dr.Rows.Count > 0 || dt_rep_dr.Rows.Count > 0)
                {
                    dataGridView2.Invoke((Func<object>)(() => dataGridView2.DataSource = dt_rep_dr.DefaultView));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Дефектуры по данным поставщикам нет");
                MessageBox.Show(ex.ToString());
            }
        }
// - для формирования отчёта по товарам, фильтр по аптекам
        private void CallBackFunc2(IAsyncResult aRes)
        {
 
            del.EndInvoke(aRes);
            panel3.Invoke((Func<bool>)(() => panel3.Enabled = true));
            tabPage2.Invoke((Func<bool>)(() => tabPage2.Enabled = true));
            tabPage1.Invoke((Func<bool>)(() => tabPage1.Enabled = true));
            dataGridView3.Invoke((Func<bool>)(() => dataGridView3.Enabled = true));
            this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            if (dt_rep_dr_ph.Rows.Count > 0)
            {
                dataGridView3.Invoke((Func<object>)(() => dataGridView3.DataSource = dt_rep_dr_ph.DefaultView));
            }
        }
        /* Фильтр по аптекам, поставщикам, регионам */
        public DataTable FiltFormShow(string formname, string flname, string sort, DataTable dt)
        {
            PharmFilter.PharmFilter f = new PharmFilter.PharmFilter();
            f.Name = formname;
            f.dataGridView1.DataSource = dt.DefaultView;
            f.namechcol = flname;
            f.sortcoumn = sort;
            f.ShowDialog();
            f.Close();
            f = null;
            return dt;
        }
//- для формирования отчёта по аптекам
        private void CreateRep()
        {
            dt_rep.Clear();
            if (conn.State == ConnectionState.Closed) conn.Open();
            try
            {
                foreach (DataRow row in pharm.Rows)
                {
                    if (Convert.ToBoolean(row[namechcol]))
                    {
                        dt_pharm.Rows.Add(row[1]);
                    }
                }
                if (dt_pharm.Rows.Count == 0)
                {
                    foreach (DataRow row in pharm.Rows)
                    {
                        dt_pharm.Rows.Add(row[1]);
                    }
                }
                SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[2];
                par[0].name = "@dateRec";
                par[0].value = dateDef;
                par[1].name = "@tbl";
                par[1].value = dt_pharm;
                dt_rep = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn, "pas_OutsSuppliersPharm", 300, par);
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                conn.Close();
            }
        }
//- для формирования отчёта по товарам, фильтр по поставщикам
        private void CreateRepDrug()
        {
            if (conn.State == ConnectionState.Closed) conn.Open();
            try
            {
                foreach (DataRow row in suppl.Rows)
                {
                    if (Convert.ToBoolean(row[namechcol]))
                    {
                        dt_suppl.Rows.Add(row[1], row[5], row[6]);
                    }
                }
                if (dt_suppl.Rows.Count == 0)
                {
                    foreach (DataRow row in suppl.Rows)
                    {
                        dt_suppl.Rows.Add(row[1], row[5], row[6]);
                    }
                }
                SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[3];
                par[0].name = "@date1";
                par[0].value = dateDP1;
                par[1].name = "@date2";
                par[1].value = dateDP2;
                par[2].name = "@tblSuppl";
                par[2].value = dt_suppl;
                dt_rep_dr = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn, "pas_OutsSuppliersProducts", 300, par);
                conn.Close();
             }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                conn.Close();
            }
        }

        //- для формирования отчёта по товарам, фильтр по аптекам
        private void CreateRepDrugPharm()
        {
            dt_rep_dr_ph.Clear();
            dt_pharm.Clear();
            if (conn.State == ConnectionState.Closed) conn.Open();
            try
            {
                foreach (DataRow row in pharm_city.Rows)
                {
                    if (Convert.ToBoolean(row[namechcol]))
                    {
                        dt_pharm.Rows.Add(row[2], row[7], row[8]);
                    }
                }
                if (dt_pharm.Rows.Count == 0)
                {
                    foreach (DataRow row in pharm_city.Rows)
                    {
                        dt_pharm.Rows.Add(row[2], row[7], row[8]);
                    }
                }
                SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[3];
                par[0].name = "@date1";
                par[0].value = dateDPP1;
                par[1].name = "@date2";
                par[1].value = dateDPP2;
                par[2].name = "@tblPharm";
                par[2].value = dt_pharm;
                dt_rep_dr_ph = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn, "pas_OutsSupplPharm", 300, par);
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                conn.Close();
            }
        }

        private void ExpToExcel(object sender, EventArgs e)
        {
            if (sender == button3)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.FileName = "Дефектура по аптекам ";
                sfd.Filter = "Файл CSV | *.csv";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    SaveDGVToCSVfile(sfd.FileName.ToString(), dataGridView1, true);
                }
            }
            else if (sender == button5)
            {

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.FileName = "Дефектура по поставщикам ";
                sfd.Filter = "Файл CSV | *.csv";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    SaveDGVToCSVfile(sfd.FileName.ToString(), dataGridView2, true);
                }
            }
            else if (sender == button8)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.FileName = "Дефектура по аптекам ";
                sfd.Filter = "Файл CSV | *.csv";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    SaveDGVToCSVfile(sfd.FileName.ToString(), dataGridView3, true);
                }
            }
        }

        public static bool SaveDGVToCSVfile(string filename, DataGridView table, bool openInExcel)
        {
            try
            {
                StreamWriter sw = new StreamWriter(filename, false, Encoding.Unicode);

                List<int> col_n = new List<int>();
                foreach (DataGridViewColumn col in table.Columns)
                    if (col.Visible)
                    {
                        sw.Write(col.HeaderText + "\t");
                        col_n.Add(col.Index);
                    }
                sw.WriteLine();
                int x = table.RowCount;
                if (table.AllowUserToAddRows) x--;

                for (int i = 0; i < x; i++)
                {
                    for (int y = 0; y < col_n.Count; y++)
                        sw.Write(table[col_n[y], i].Value + "\t");
                    sw.Write(" \r\n");
                }
                sw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }

            if (openInExcel)
            {
                try
                {
                    Process newProc = Process.Start("excel.exe", "\"" + filename + "\"");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
            return true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            /* Фильтр по аптекам для общего отчёта */
            int fl = 0;
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            pharm = FiltFormShow("Аптеки", namechcol, "Аптека", pharm);
            fl = 0;
            foreach (DataRow dr in pharm.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    listBox1.Items.Add(dr["Аптека"].ToString());
                }
            }
            if (fl == 0)
            {
                listBox1.Items.Add("Все");
            }
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            // изменение даты
            dateDef = dateTimePicker1.Value;
        }

        private void button6_Click(object sender, EventArgs e)
        {
            // фильтр по поставщикам
            int fl = 0;
            listBox2.Items.Clear();
            suppl = FiltFormShow("Поставщики", namechcol, "Поставщик", suppl);
            fl = 0;
            foreach (DataRow dr in suppl.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    listBox2.Items.Add(dr["Поставщик"].ToString());
                }
            }
            if (fl == 0)
            {
                listBox2.Items.Add("Все");
             }
        }
        /* фильтр по аптекам для отчёта по позициям товара*/
        private void button7_Click(object sender, EventArgs e)
        {
            int fl = 0;
            listBox3.Items.Clear();
            pharm_city = FiltFormShow("Аптеки", namechcol, "Аптека", pharm_city);
            fl = 0;
            foreach (DataRow dr in pharm_city.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    listBox3.Items.Add(dr["Аптека"].ToString());
                }
            }
            if (fl == 0)
            {
                listBox3.Items.Add("Все");
            }
         }
        //- выбор дат
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            @dateDP1 = dateTimePicker2.Value;
        }

        private void dateTimePicker3_ValueChanged(object sender, EventArgs e)
        {
            @dateDP2 = dateTimePicker3.Value;
        }

        private void dateTimePicker4_ValueChanged(object sender, EventArgs e)
        {
            @dateDPP1 = dateTimePicker4.Value;
        }

        private void dateTimePicker5_ValueChanged(object sender, EventArgs e)
        {
            @dateDPP2 = dateTimePicker5.Value;
        }

        private void dataGridView2_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            //- Прорисовка цвета для DataGridView2
            for (int i = 0; i < dataGridView2.Rows.Count; i++)
            {
                if ((dataGridView2.Rows[i].Cells[0].Value == null || dataGridView2.Rows[i].Cells[0].Value.ToString() == "") && dataGridView2.Rows[i].Cells[7].Value != null)
                {
                    if (Convert.ToInt32(dataGridView2.Rows[i].Cells[7].Value) >= 0 && Convert.ToInt32(dataGridView2.Rows[i].Cells[7].Value) < 100)
                    {
                        dataGridView2.Rows[i].DefaultCellStyle.BackColor = Color.LightGreen;
                    }
                    else if (Convert.ToInt32(dataGridView2.Rows[i].Cells[7].Value) >= 100 && Convert.ToInt32(dataGridView2.Rows[i].Cells[7].Value) < 200)
                    {
                        dataGridView2.Rows[i].DefaultCellStyle.BackColor = Color.PeachPuff;
                    }
                    else
                    {
                        dataGridView2.Rows[i].DefaultCellStyle.BackColor = Color.LightCoral;
                    }
                }
            }
        }

     }         
}
